#include <iostream>
#include <ctime>

// 日志级别定义
#define DBG_LEVEL 0  // 调试级别
#define INF_LEVEL 1  // 信息级别
#define ERR_LEVEL 2  // 错误级别

// 默认日志级别设置为调试级别
#define DEFAULT_LEVEL DBG_LEVEL

// 通用日志宏
// lev_str: 日志级别字符串（如 "DBG"）
// level: 当前日志的级别
// format: 格式化字符串
// ...: 可变参数，对应格式化字符串中的占位符
#define LOG(lev_str, level, format, ...) {\
    if (level >= DEFAULT_LEVEL) {\
        time_t t = time(nullptr);\
        struct tm* ptm = localtime(&t);\
        char time_str[32];\
        strftime(time_str, 31, "%H:%M:%S", ptm);\
        /* 使用##__VA_ARGS__处理无参数的情况，避免语法错误 */ \
        printf("[%s][%s][%s:%d]\t" format "\n", lev_str, time_str, __FILE__, __LINE__, ##__VA_ARGS__);\
    }\
}

// 调试日志宏，级别为DBG_LEVEL
#define DLOG(format, ...) LOG("DBG", DBG_LEVEL, format, ##__VA_ARGS__)
// 信息日志宏，级别为INF_LEVEL
#define ILOG(format, ...) LOG("INF", INF_LEVEL, format, ##__VA_ARGS__)
// 错误日志宏，级别为ERR_LEVEL
#define ELOG(format, ...) LOG("ERR", ERR_LEVEL, format, ##__VA_ARGS__)

int main() 
{
    // 测试日志输出
    DLOG("调试信息：%s", "Hello World");  // 调试级别日志
    ILOG("普通信息：程序启动");           // 信息级别日志
    ELOG("错误信息：文件打开失败，错误码：%d", 404); // 错误级别日志
    return 0;
}